package reflect;

import java.lang.reflect.Field;
import java.util.ResourceBundle;

/**
 * 通过反射机制挂钩属性 访问赋值或者读取一个对象的书属性
 */
public class ReflectTest07 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
        /**
         * 对比传统方法
         * User user = new User（）；
         * user.age = 11;
         * sout(user.age)
         *
         * 共同的三要素：
         * 1 obj对象
         * 2. age属性
         * 3 要赋的值
         *
         * 反射优势：非常灵魂 把参数都写在配置文件里就可以都用了
         */
        //1 获取类
        ResourceBundle bundle = ResourceBundle.getBundle("classinfo2");
        Class c = Class.forName(bundle.getString("className"));

        //2获得所有类的同一属性
        Field ageField = c.getDeclaredField("age");
        Field nameField = c.getDeclaredField("name");

        //实例化对象 进行属性操作--该方法不可访问private
        Object object = c.newInstance();
        ageField.set(object,22);//赋值
        System.out.println(ageField.get(object));//读取

        //访问私有元素，打破封装！！！
        nameField.setAccessible(true);//加上这句话
        nameField.set(object,"hqq");//赋值
        System.out.println(nameField.get(object));//读取

    }
}
